if( typeof(__defined_dlgModal) == "undefined" ){

/*---------------------------------------------
 * prototype.jsを使用して実際に使用されるクラスを生成
 *--------------------------------------------- */
var dlgModal = function(initparam)
{
    this.initialize(initparam);
}

/*---------------------------------------------
 * クラス定義
 *--------------------------------------------- */
dlgModal.prototype = {

    //=============================
    // メンバー
    //=============================
	elm_dialog     :null,               // ダイアログオブジェクト

    initparam      :{},         // 初期化パラメータ
    dataparam      :{},         // データパラメータ
	width          :450,                // ダイアログ幅
	height         :400,                // ダイアログ高さ
	container      :"dlg_container",    // コンテナエレメントのID
	base_id        :null,               // 表示・消去時のアニメーションのベースとなるエレメントID
	callback       :new Array(),        // コールバック定義
	auto_loading   :false,
	masked_elms    :new Array(),

    /*
     * 関数名：initialize
     * 概　要：初期化処理（newで生成した際に呼び出される）
     * 引　数：param        mixed    初期化パラメータ
     * 戻り値：なし
     */
    initialize: function( initparam )
    {
        this.fncSetInitParameter( initparam ) ;
        
        this.fncInitialize();
    },
    
    /*
     * 関数名：fncSetInitParameter
     * 概　要：初期化パラメータをセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncSetInitParameter: function( initparam )
    {
        if( initparam != null){
            this.initparam = this.initparam.merge(initparam) ;
        }
        
        // initparamの内容で、メンバー値を初期化
        var keys = this.initparam.keys().toString() ;
        if( keys != "" ){
            var keysarr = keys.split(',') ;
            for( i in keysarr ){
                this[keysarr[i]] = this.initparam[keysarr[i]] ;
            }
        }
    },
    
    /*
     * 関数名：fncInitialize
     * 概　要：ダイアログ初期化処理を行う（初期化時に呼び出される）
     * 引　数：なし
     * 戻り値：なし
     */
    fncInitialize: function()
    {
        // サブクラスにて必要な際に実装
    },
    
    /*
     * 関数名：fncReset
     * 概　要：ダイアログ内容をリセットする（再表示時に呼び出される）
     * 引　数：なし
     * 戻り値：なし
     */
    fncReset: function()
    {
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：fncCreateDialog
     * 概　要：コンテナエレメントに対して、ダイアログオブジェクトを生成する
     * 引　数：なし
     * 戻り値：なし
     */
    fncCreateDialog : function(){
        // ダイアログ生成
	    this.elm_dialog = new Ext.BasicDialog(this.container, { 
            modal:      true,
            width:      this.width,
            height:     this.height,
            shadow:     true,
            minWidth:   this.width,
            minHeight:  this.height,
            resizable:  false
		});
		// イベント設定
		this.elm_dialog.addListener('beforehide', this.__onBeforeHide, this, true);
		this.elm_dialog.addListener('beforeshow', this.__onBeforeShow, this, true);
		this.elm_dialog.addListener('hide', this.__onHide, this, true);
		this.elm_dialog.addListener('keydown', this.__onKeyDown, this, true);
		this.elm_dialog.addListener('move', this.__onMove, this, true);
		this.elm_dialog.addListener('resize', this.__onResize, this, true);
		this.elm_dialog.addListener('show', this.__onShow, this, true);
		this.elm_dialog.addKeyListener(27, this.elm_dialog.hide, this.elm_dialog);
    },

    /*
     * 関数名：__onBeforeHide
     * 概　要：ダイアログ非表示前イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    __onBeforeHide : function ( dlg ){
        this.onBeforeHide( dlg ) ;
    },

    /*
     * 関数名：onBeforeHide
     * 概　要：ダイアログ非表示前イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onBeforeHide : function ( dlg ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onBeforeShow
     * 概　要：ダイアログ表示前イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    __onBeforeShow : function ( dlg ){
        this.onBeforeShow( dlg ) ;
    },

    /*
     * 関数名：onBeforeShow
     * 概　要：ダイアログ表示前イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onBeforeShow : function ( dlg ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onHide
     * 概　要：ダイアログ非表示イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    __onHide : function ( dlg ){
/*
        for( var index=0 ; index<this.masked_elms.length ; index++ ){
            YAHOO.util.Dom.setStyle(this.masked_elms[index].elm, 'visibility', this.masked_elms[index].visibility ) ;
        }
*/
        this.onHide( dlg ) ;
    },

    /*
     * 関数名：onHide
     * 概　要：ダイアログ非表示イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onHide : function ( dlg ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onKeyDown
     * 概　要：キー押下イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         e                          YAHOO.ext.EventObject    イベントオブジェクト
     * 戻り値：なし
     */
    __onKeyDown : function ( dlg, e ){
        this.onKeyDown( dlg, e ) ;
    },

    /*
     * 関数名：onKeyDown
     * 概　要：キー押下イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         e                          YAHOO.ext.EventObject    イベントオブジェクト
     * 戻り値：なし
     */
    onKeyDown : function ( dlg, e ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onMove
     * 概　要：ダイアログ移動イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         x                          Number                   X座標値
     *         y                          Number                   Y座標値
     * 戻り値：なし
     */
    __onMove : function ( dlg, x, y ){
        this.onMove( dlg, x, y  ) ;
    },

    /*
     * 関数名：onMove
     * 概　要：ダイアログ移動イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         x                          Number                   X座標値
     *         y                          Number                   Y座標値
     * 戻り値：なし
     */
    onMove : function ( dlg, x, y  ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onResize
     * 概　要：ダイアログリサイズイベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         width                      Number                   幅
     *         height                     Number                   高さ
     * 戻り値：なし
     */
    __onResize : function ( dlg, width, height ){
        this.onResize( dlg, width, height  ) ;
    },

    /*
     * 関数名：onResize
     * 概　要：ダイアログリサイズイベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     *         width                      Number                   幅
     *         height                     Number                   高さ
     * 戻り値：なし
     */
    onResize : function ( dlg, width, height  ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：__onShow
     * 概　要：ダイアログ表示イベント（スーパークラス用）
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    __onShow : function ( dlg ){
        if( this.auto_loading ){
            app_loadingStart();
        }
        this.onShow( dlg ) ;
    },

    /*
     * 関数名：onShow
     * 概　要：ダイアログ表示イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onShow : function ( dlg ){
        // サブクラスにて必要な際に実装
    },

    /*
     * 関数名：fncShowDialog
     * 概　要：ダイアログを表示する
     * 引　数：initparam    Hash    初期化パラメータハッシュ
     * 戻り値：なし
     */
    fncShowDialog : function ( initparam ){
        // 初期化パラメータ設定
        if( initparam != null){
            this.fncSetInitParameter( initparam ) ;
        }

        if( this.elm_dialog == null ){
            // 初回のみダイアログオブジェクト生成
            this.fncCreateDialog() ;
            this.fncReset() ;
        }
        else{
            // 再表示時はリセット処理
            this.fncReset() ;
        }

        var base_elm_dom = null ;
        if( this.base_id != null ){        
            var base_elm = Ext.get(this.base_id) ;
            base_elm_dom = base_elm.dom ;
        }
        else{
        }

/*
        var elm_is_visible = function(element){
            if( YAHOO.util.Dom.getStyle(element,"visibility" ) ) return true ; else false ;
        }
        var masked_elms = YAHOO.util.Dom.getElementsBy(elm_is_visible, 'select') ;
        this.masked_elms.clear() ;
        for( var index=0 ; index<masked_elms.length ; index++ ){
            this.masked_elms.push( {elm:masked_elms[index], visibility:YAHOO.util.Dom.getStyle(masked_elms[index],"visibility" )} ) ;
            YAHOO.util.Dom.setStyle(masked_elms[index], 'visibility', 'hidden' ) ;
        }
*/
        this.elm_dialog.center() ;
       	this.elm_dialog.show(base_elm_dom);

        return false ;
    },

    /*
     * 関数名：fncExecCallbackFunc
     * 概　要：コールバック関数が指定されていれば、それを呼び出す
     * 引　数：callback_name    string    コールバック種類文字列
     * 戻り値：なし
     */
    fncExecCallbackFunc : function( callback_name ){
        if( this.callback == null )    return false ;
        if( this.callback[callback_name] == null )    return false ;
        
        // 指定されているコールバック関数の配列を取得
        var target_callback = this.callback[callback_name] ;
    
        // コールバック関数を順に実施
        if( target_callback != null && target_callback.length > 0 ){
            for( var findex=0 ; findex<target_callback.length ; findex++ ){
                var cb_func = target_callback[findex] ;
                cb_func.call() ;
            }
        }
    },

    /*
     * 関数名：fncDecodeJSON
     * 概　要：指定された非同期通信レスポンスデータをデコードする
     * 引　数：responseText    string    非同期通信レスポンス文字列
     * 戻り値：JSONオブジェクト
     */
    fncDecodeJSON : function( responseText ){
        return Ext.util.JSON.decode(responseText) ;
    }

}
}